package Dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import common.CommException;
import common.JdbcUtils;
import domain.User;

/**
 * 1.该类主要定义一些数据库操作的方法(包含增删改查的方法)。
 * 2.只会被业务类的方法调用。
 * 3.也只有在该类中才允许执行sql语句进行数据库操作。
 * @author cqyhm
 */
public class UserDao {
	
	private Logger logger=LoggerFactory.getLogger(getClass());
	/**
	 * 行映射器：把表中的行转换为对象
	 * @param rs
	 * @return
	 * @throws SQLException
	 */
	private User rowMap(ResultSet rs) throws SQLException {
		User user=new User();
		user.setUsercode(rs.getString("usercode"));
		user.setUsername(rs.getString("username"));
		user.setPassword(rs.getString("password"));
		user.setUsertype(rs.getInt("usertype"));
		user.setEmail(rs.getString("email"));
		return user;
	}

	/**
	 * 根据账号查询用户信息
	 * @param usercode
	 * @return
	 */
	public User findByCode(String usercode) {
		//1.获取数据库链接
		Connection conn=JdbcUtils.getConnection();
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			//2.准备sql语句
			String sql="select * from user where usercode=?";
			ps=conn.prepareStatement(sql);
			//3.给sql语句设置参数
			ps.setString(1, usercode);
			
			logger.info("{}",sql);
			//4.执行sql语句
			rs=ps.executeQuery();
			//5.处理sql执行的结果
			while (rs.next()) {
				return rowMap(rs);
			}
			return null;
		} catch (Exception e) {
			throw new CommException("插入数据异常:"+e.getMessage());
		}finally {
			//6.关闭资源(链接、语句、结果集)
			JdbcUtils.close(conn, ps, rs);
		}
	}
	/**
	 * 根据用户信息查询用户列表
	 * @param usercode
	 * @return
	 */
	public List<User> findList(User user) {
		//1.获取数据库链接
		Connection conn=JdbcUtils.getConnection();
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			//2.准备sql语句
			String sql="select * from user where usercode like ? and username like ? and usertype=?";
			ps=conn.prepareStatement(sql);
			//3.给sql语句设置参数
			ps.setString(1, "%"+user.getUsercode()+"%");
			ps.setInt(3, user.getUsertype());
			logger.info("{}",sql);
			//4.执行sql语句
			rs=ps.executeQuery();
			//5.处理sql执行的结果
			List<User> users=new ArrayList<>();
			while (rs.next()) {
				users.add(rowMap(rs));
			}
			return users;
		} catch (Exception e) {
			e.printStackTrace();
	throw new CommException("插入数据异常:"+e.getMessage());
		}finally {
			//6.关闭资源(链接、语句、结果集)
			JdbcUtils.close(conn, ps, rs);
		}
	}
	/**
	 * 插入数据到表中
	 * @param user
	 */
	public void insert(User user) {
		//1.获取数据库链接
		Connection conn=JdbcUtils.getConnection();
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			//2.准备sql语句
			String sql="insert into user(usercode,username,password,email) values(?,?,?,?)";
			ps=conn.prepareStatement(sql);
			//3.准备sql语句的参数
			ps.setString(1, user.getUsercode());
			ps.setString(2, user.getUsername());
			ps.setString(3, user.getPassword());
			ps.setString(4, user.getEmail());
			
			
			
			
			logger.info("{}",sql);
			//4.执行sql语句并处理返回结果
			if(ps.executeUpdate()!=1) {
				throw new CommException("插入数据错误");
			}
		} catch (Exception e) {
			throw new CommException("插入数据异常:"+e.getMessage());
		}finally {
			//5.关闭资源
			JdbcUtils.close(conn, ps, rs);
		}
	}
	/**
	 * 修改用户信息
	 * @param user
	 */
	public void update(User user) {
		//1.获取数据库链接
		Connection conn=JdbcUtils.getConnection();
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			//2.准备sql语句
			String sql="update user set username=?,password=?,usertype=? where usercode=?";
			ps=conn.prepareStatement(sql);
			//3.准备sql语句的参数
			ps.setString(2, user.getPassword());
			ps.setInt(3, user.getUsertype());
			ps.setString(4, user.getUsercode());
			
			logger.info("{}",sql);
			//4.执行sql语句并处理结果
			if(ps.executeUpdate()!=1) {
				throw new CommException("修改数据错误");
			}
		} catch (Exception e) {
			throw new CommException("修改数据异常:"+e.getMessage());
		}finally {
			//5.关闭资源(链接、语句、结果集)
			JdbcUtils.close(conn, ps, rs);
		}
		
	}

}
